import Axios from 'axios';
// 若不加{}则将拿出的是整个config的对象结果就是{cookieExpires: 1,useI18n: false,baseUrl: BASE_URL},若加了{baseURL}则直接拿该属性的值
import {Message} from 'iview';
import Cookies from 'js-cookie';
import {TOKEN_KEY} from './util';
import env from '../config/env';
import {runDevConfig} from '../config/dev.config';
import {runProduceConfig} from '../config/produce.config';
import userStore from '../store/module/user';
//根据env配置来读取相应环境的的配置信息
const runConfig = env === 'development' ? runDevConfig : runProduceConfig;
// 设置跨越访问的地址
const ajaxUrl = runConfig.baseUrl;

class httpRequest {
    constructor() {
        this.options = {
            method: '',
            url: ''
        };
        // 存储请求队列
        this.queue = {};
    }
    // 销毁请求实例
    destroy(url) {
        delete this.queue[url];
        const queue = Object.keys(this.queue);
        return queue.length;
    }
    // 请求拦截
    interceptors(instance, url) {
        // 添加请求拦截器
        instance.interceptors.request.use(config => {
            // 如果token不为空则将每次的token全部带入到header传送到到我们的接口中
            if (userStore.state.token!='') {
                config.headers['x-access-token'] = userStore.state.token;
            }
            // Spin.show()
            // 在发送请求之前做些什么
            return config;
        }, error => {
            // 对请求错误做些什么
            return Promise.reject(error);
        });
        // 添加响应拦截器
        instance.interceptors.response.use((res) => {
            let {data} = res;
            const is = this.destroy(url);
            if (!is) {
                setTimeout(() => {
                    // Spin.hide()
                }, 500);
            }
            if (res.status !== 200) {
                // 后端服务在个别情况下回报201，待确认
                if (res.status === 401) {
                    Cookies.remove(TOKEN_KEY);
                    window.location.href = window.location.pathname + '#/login';
                    Message.error('未登录，或登录失效，请登录');
                } else {
                    if (res.msg) Message.error(res.msg);
                }
                return false;
            }
            return data;
        }, (error) => {
            Message.error('服务内部错误');
            // 对响应错误做点什么
            return Promise.reject(error);
        });
    }
    // 创建实例
    create() {
        let conf = {
            baseURL: ajaxUrl,
            timeout: 5000,
            headers: {
                'Access-Control-Allow-Origin': '*',
                'Content-Type': 'application/json; charset=utf-8',
                'X-URL-PATH': location.pathname
            }
        };
        return Axios.create(conf);
    }
    // 合并请求实例
    mergeReqest(instances = []) {
        //
    }
    // 请求实例
    request(options) {
        var instance = this.create();
        this.interceptors(instance, options.url);
        options = Object.assign({}, options);
        this.queue[options.url] = instance;
        return instance(options);
    }
}
export default httpRequest;
